﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;

namespace AccesoBD
{
    public class AgendasTurnos
    {
        public static void actualizarEstadoTurno(long idTurno, int estado)
        {
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "UPDATE    Turno "
                                    + "SET idEstadoTurno =@estadoTurno "
                                    + "WHERE     (idTurno = @idTurno)";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@idTurno", idTurno));
                listp.Add(new SqlParameter("@estadoTurno", estado));
                int r = DB.EjecutarCommand(comando, listp, con, tran);
                if (r > 0)
                {
                    tran.Commit();
                }
            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {
                con.Close();
            }
        }
        public static void actualizarEstadoOrdenLLegada(long nroOrden, int estado)
        {
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "UPDATE    Listado_OrdenLLegada "
                                + "SET atendido = @estadoOrdenLL "
                                + "WHERE     (nroOrden = @idOrden)";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@idOrden", nroOrden));
                listp.Add(new SqlParameter("@estadoOrdenLL", estado));
                int r = DB.EjecutarCommand(comando, listp, con, tran);
                if (r > 0)
                {
                    tran.Commit();
                }
            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {
                con.Close();
            }
        }
        //Obtener turnos para la semana para el medico
        public static List<Turno> obtenerTurnosParaLaSemanaPorMedico(long legajo, DateTime fechaDesde, DateTime fechaHasta, TimeSpan horaDesde, TimeSpan horaHasta)
        {
            List<Turno> list = null;
            Turno oT = null;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "SELECT * "
                                + "from Turno T,Especialidad E "
                                + "where T.legajoMedico=@legajo and CAST(T.fechaTurno as DATE)>=CAST(@fechaDesde as DATE) and CAST(T.fechaTurno as DATE)<=CAST(@fechaHasta as DATE)and T.horaTurno>(@HoraDesde)and T.horaTurno<(@HoraHasta) and T.idEspecialidad=E.codEspecialidad "
                                + "order by T.horaTurno";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@legajo", legajo));
                listp.Add(new SqlParameter("@fechaDesde", fechaDesde));
                listp.Add(new SqlParameter("@fechaHasta", fechaHasta));
                listp.Add(new SqlParameter("@HoraDesde", horaDesde));
                listp.Add(new SqlParameter("@HoraHasta", horaHasta));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                list = new List<Turno>();
                while (dr.Read())
                {
                    oT = new Turno();
                    oT.IdTurno = long.Parse(dr["idTurno"].ToString());
                    oT.FechaTurno = DateTime.Parse(dr["FechaTurno"].ToString());
                    oT.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                    if (dr["horaRealLLegada"] != DBNull.Value)
                    {
                        oT.HoraRealLlegada = TimeSpan.Parse(dr["horaRealLLegada"].ToString());
                    }
                    if (dr["nroHcPaciente"] != DBNull.Value)
                    {
                        oT.NroHCPaciente = long.Parse(dr["nroHcPaciente"].ToString());
                    }


                    oT.IdEspecialidad = (int)dr["IdEspecialidad"];
                    oT.nombreEspecialidad = dr["nombre"].ToString();
                    oT.MiEstadoTurno = new EstadoTurno();
                    oT.MiEstadoTurno.IdEstadoTurno = (int)dr["idEstadoTurno"];
                    list.Add(oT);
                    oT = null;


                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return list;

        }
        //Obtener turnos para la fecha, Medico y especialidad.
        public static List<Turno> obtenerTurnosALaFechaPorMedico(long legajo, int codEspecialidad, DateTime fecha)
        {
            List<Turno> list = null;
            Turno oT = null;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.idEstadoTurno ,Turno.fechaTurno , Turno.horaTurno as horaTurno,Turno.horaRealLlegada as HoraLLegada,Persona.nombre as NombrePaciente, Persona.apellido as ApellidoPaciente, Paciente.nroHC as NroHcPaciente, Especialidad.nombre as NombreEsp, Especialidad.codEspecialidad as IdEspecialidad,Estado_Turno.nombre as nombreEstado "
                                   + "FROM Turno INNER JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                      + "Persona ON Paciente.idPersona = Persona.codPersona INNER JOIN "
                      + "MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                     + "Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN Estado_Turno ON Turno.idEstadoTurno =Estado_Turno.idEstadoTurno "
                    + "where Turno.legajoMedico=@legajo and CAST(Turno.fechaTurno as DATE)=CAST(@fechaTurno as DATE) and Turno.idEstadoTurno=3 or Turno.idEstadoTurno=4 and MedicoXEspecialidad.codEspecialidad=@codEspecialidad "
                     + "order by Turno.horaTurno";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@legajo", legajo));
                listp.Add(new SqlParameter("@fechaTurno", fecha));
                listp.Add(new SqlParameter("@codEspecialidad", codEspecialidad));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                list = new List<Turno>();
                while (dr.Read())
                {
                    oT = new Turno();
                    oT.IdTurno = long.Parse(dr["idTurno"].ToString());
                    oT.FechaTurno = DateTime.Parse(dr["FechaTurno"].ToString());
                    oT.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());

                    if (dr["HoraLLegada"] != DBNull.Value)
                    {
                        oT.HoraRealLlegada = TimeSpan.Parse(dr["HoraLLegada"].ToString());
                    }
                    oT.NombrePaciente = dr["NombrePaciente"].ToString();
                    oT.ApellidoPaciente = dr["ApellidoPaciente"].ToString();
                    oT.NroHCPaciente = long.Parse(dr["NroHcPaciente"].ToString());
                    oT.nombreEspecialidad = dr["NombreEsp"].ToString();
                    oT.IdEspecialidad = (int)dr["IdEspecialidad"];
                    oT.MiEstadoTurno = new EstadoTurno();
                    oT.MiEstadoTurno.Nombre = dr["nombreEstado"].ToString();
                    oT.MiEstadoTurno.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                    list.Add(oT);
                    oT = null;


                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return list;
        }
        //obtiene todas las fecha NO LABORALES del año en transcurso
        public static List<FechaImportante> obtenerFeriadosAñoVigente()
        {
            List<FechaImportante> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT fecha, motivo, noLaborable FROM Fecha_Importante WHERE (noLaborable = 1) ORDER BY fecha";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<FechaImportante>();
                    FechaImportante fechaImp;
                    while (dr.Read())
                    {
                        fechaImp = new FechaImportante();
                        fechaImp.Fecha = DateTime.Parse(dr["fecha"].ToString());
                        fechaImp.Motivo = dr["motivo"].ToString();
                        fechaImp.NoLaborable = bool.Parse(dr["noLaborable"].ToString());

                        list.Add(fechaImp);
                        fechaImp = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }
        //OBTENER EL TIPO DE MODALIDAD SEGUN ESPECIALIDAD Y MEDICO
        public static TipoModalidad tipoModalidadPorEspecialidadYMedico(long legajo, int dia, TimeSpan hora)
        {
            SqlConnection con = DB.Conectar();
            TipoModalidad tpM = null;
            try
            {
                string comando = "select e.nombre,m.idTipoModalidad,e.codEspecialidad,tp.nombre, ha.legajo,ha.idConsultorio,ha.horaDesde,ha.horaHasta,ha.diaSemana "
+ "from Especialidad e, Modalidad_Atencion m, Tipo_Modalidad tp,HorarioAtencionXMedicoXEspecialidad ha "
+ "where e.modalidad=m.codModalidad and m.idTipoModalidad=tp.codTipoModalidad and ha.codEspecialidad=e.codEspecialidad and ha.legajo=@lega and diaSemana=@dia and @hora between ha.horaDesde and ha.horaHasta";

                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@lega", legajo));
                listp.Add(new SqlParameter("@hora", hora));
                listp.Add(new SqlParameter("@dia", dia));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    tpM = new TipoModalidad();
                    tpM.CodTipoModalidad = (int)dr["idTipoModalidad"];
                    tpM.especialidad = new Especialidad();
                    tpM.especialidad.CodEspecialidad = (int)dr["codEspecialidad"];
                }


            }
            catch (Exception)
            {

                throw;
            }
            finally
            { con.Close(); }

            return tpM;

        }

        //obtiene todas los horarios VIGENTES de la EspecialidadMédico recibida
        public static List<HorarioAtencion> obtenerHorariosVigentesEspecialidadMedico(EspecialidadMedico espMed)
        {
            List<HorarioAtencion> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT HorarioAtencionXMedicoXEspecialidad.codHorarioAtencionXMedicoXEspecialidad, HorarioAtencionXMedicoXEspecialidad.legajo, HorarioAtencionXMedicoXEspecialidad.codEspecialidad, "
                               + "HorarioAtencionXMedicoXEspecialidad.horaDesde, HorarioAtencionXMedicoXEspecialidad.horaHasta, HorarioAtencionXMedicoXEspecialidad.diaSemana, "
                               + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaDesde, HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta, HorarioAtencionXMedicoXEspecialidad.idConsultorio, "
                               + "HorarioAtencionXMedicoXEspecialidad.permiteSobreturno, HorarioAtencionXMedicoXEspecialidad.cantidadSobreturnos, HorarioAtencionXMedicoXEspecialidad.idFrecuenciaHorario, "
                               + "Frecuencia_HorarioAtencion.periodo, Frecuencia_HorarioAtencion.cantidadDias, Consultorio.nombre AS consultorio, Dia_Semana.nombre AS nombreDiaSemana "
                               + "FROM HorarioAtencionXMedicoXEspecialidad INNER JOIN Consultorio ON HorarioAtencionXMedicoXEspecialidad.idConsultorio = Consultorio.idConsultorio INNER JOIN "
                               + "Frecuencia_HorarioAtencion ON HorarioAtencionXMedicoXEspecialidad.idFrecuenciaHorario = Frecuencia_HorarioAtencion.idFrecuencia INNER JOIN "
                               + "Dia_Semana ON HorarioAtencionXMedicoXEspecialidad.diaSemana = Dia_Semana.codDiaSemana INNER JOIN MedicoXEspecialidad ON HorarioAtencionXMedicoXEspecialidad.legajo = MedicoXEspecialidad.legajo AND "
                               + "HorarioAtencionXMedicoXEspecialidad.codEspecialidad = MedicoXEspecialidad.codEspecialidad "
                               + "WHERE (HorarioAtencionXMedicoXEspecialidad.legajo = @legajo) AND (HorarioAtencionXMedicoXEspecialidad.codEspecialidad = @codEsp) AND "
                               + "(HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta IS NULL OR HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta > GETDATE()) "
                               + "ORDER BY HorarioAtencionXMedicoXEspecialidad.fechaVigenciaDesde, HorarioAtencionXMedicoXEspecialidad.diaSemana";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", espMed.LegajoMedico));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", espMed.CodEspecialidad));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<HorarioAtencion>();
                    HorarioAtencion horarioAt;
                    while (dr.Read())
                    {
                        horarioAt = new HorarioAtencion();
                        horarioAt.CodHorarioAtencion = int.Parse(dr["codHorarioAtencionXMedicoXEspecialidad"].ToString());
                        horarioAt.Legajo = long.Parse(dr["legajo"].ToString());
                        horarioAt.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        horarioAt.HoraDesde = TimeSpan.Parse(dr["horaDesde"].ToString());
                        horarioAt.HoraHasta = TimeSpan.Parse(dr["horaHasta"].ToString());

                        //dia semana
                        horarioAt.IdDiaSemana = int.Parse(dr["diaSemana"].ToString());
                        horarioAt.NombreDiaSemana = dr["nombreDiaSemana"].ToString();
                        switch (horarioAt.IdDiaSemana)
                        {
                            case 1:
                                horarioAt.DayWeekHorario = DayOfWeek.Sunday;
                                break;
                            case 2:
                                horarioAt.DayWeekHorario = DayOfWeek.Monday;
                                break;
                            case 3:
                                horarioAt.DayWeekHorario = DayOfWeek.Tuesday;
                                break;
                            case 4:
                                horarioAt.DayWeekHorario = DayOfWeek.Wednesday;
                                break;
                            case 5:
                                horarioAt.DayWeekHorario = DayOfWeek.Thursday;
                                break;
                            case 6:
                                horarioAt.DayWeekHorario = DayOfWeek.Friday;
                                break;
                            case 7:
                                horarioAt.DayWeekHorario = DayOfWeek.Saturday;
                                break;
                        }

                        horarioAt.FechaVigenciaDesde = DateTime.Parse(dr["fechaVigenciaDesde"].ToString());
                        if (dr["fechaVigenciaHasta"] == DBNull.Value)
                            horarioAt.FechaVigenciaHasta = null;
                        else
                            horarioAt.FechaVigenciaHasta = DateTime.Parse(dr["fechaVigenciaHasta"].ToString());
                        horarioAt.IdConsultorio = int.Parse(dr["idConsultorio"].ToString());
                        horarioAt.NombreConsultorio = dr["consultorio"].ToString();
                        horarioAt.PermiteSobreturno = bool.Parse(dr["permiteSobreturno"].ToString());
                        if (dr["cantidadSobreturnos"] == DBNull.Value)
                            horarioAt.CantidadSobreturnos = null;
                        else
                            horarioAt.CantidadSobreturnos = int.Parse(dr["cantidadSobreturnos"].ToString());

                        //frecuencia horario
                        horarioAt.IdFrecuenciaHorario = int.Parse(dr["idFrecuenciaHorario"].ToString());
                        horarioAt.FrecuenciaHorario = new FrecuenciaHorarioAtencion();
                        horarioAt.FrecuenciaHorario.IdHorario = int.Parse(dr["idFrecuenciaHorario"].ToString());
                        horarioAt.FrecuenciaHorario.CantidadDias = int.Parse(dr["cantidadDias"].ToString());
                        horarioAt.FrecuenciaHorario.Periodo = dr["periodo"].ToString();


                        list.Add(horarioAt);
                        horarioAt = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public static bool registrarNuevosTurnos(List<Turno> listaTurnosNuevos)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            DateTime fechaUltimoTurno = DateTime.Now;
            long legajoMedico = 0;
            int codEspecialidad = 0;
            try
            {
                trans = conexion.BeginTransaction();
                int filas = 0;
                foreach (Turno item in listaTurnosNuevos)
                {
                    string comando = "INSERT INTO Turno (fechaGeneracion, fechaTurno, horaTurno, idEstadoTurno, legajoMedico, idEspecialidad) "
                                          + "VALUES (@fechaGeneracion,@fechaTurno,@horaTurno,@idEstadoTurno,@legajo,@codEsp)";
                    SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Parameters.Add(new SqlParameter("@fechaGeneracion", item.FechaGeneracion));
                    sqlcmd.Parameters.Add(new SqlParameter("@fechaTurno", item.FechaTurno));
                    sqlcmd.Parameters.Add(new SqlParameter("@horaTurno", item.HoraTurno));
                    sqlcmd.Parameters.Add(new SqlParameter("@idEstadoTurno", item.IdEstadoTurno));
                    sqlcmd.Parameters.Add(new SqlParameter("@legajo", item.EspMedico.LegajoMedico));
                    sqlcmd.Parameters.Add(new SqlParameter("@codEsp", item.EspMedico.CodEspecialidad));
                    sqlcmd.Transaction = trans;
                    fechaUltimoTurno = item.FechaTurno;
                    legajoMedico = item.EspMedico.LegajoMedico;
                    codEspecialidad = item.EspMedico.CodEspecialidad;
                    filas = sqlcmd.ExecuteNonQuery();
                }

                if (filas > 0)
                {
                    string comando = "UPDATE MedicoXEspecialidad SET fechaUltimoTurno = @fechaUltimoTurno where legajo=@legajo and codEspecialidad=@codEsp";
                    List<SqlParameter> lsp = new List<SqlParameter>();
                    lsp.Add(new SqlParameter("@fechaUltimoTurno", fechaUltimoTurno));
                    lsp.Add(new SqlParameter("@legajo", legajoMedico));
                    lsp.Add(new SqlParameter("@codEsp", codEspecialidad));
                    int resultado = DB.EjecutarCommand(comando, lsp, conexion, trans);
                    if (resultado > 0)
                    {
                        res = true;

                        trans.Commit();
                    }

                }

            }
            catch (Exception)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }
        public static DateTime obtenerUltimaFechaTurno(SqlConnection con, SqlTransaction tran, int codEspecialidad, long legajo)
        {
            DateTime fechaUltimoTurno = new DateTime();
            try
            {
                string comando = "select Max(Cast(fechaTurno as date)) from Turno where idEspecialidad=@codEspecialidad and legajo=@legajo";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@codEspecialidad", codEspecialidad));
                listp.Add(new SqlParameter("@legajo", legajo));


                string fecha = DB.EjecutarScalar(comando, listp, con, tran);
                if (!string.IsNullOrEmpty(fecha))
                {
                    fechaUltimoTurno = DateTime.Parse(fecha.ToString());
                }
            }
            catch (Exception Ex)
            {
                throw new Exception("Error al obtener ultima fecha Generada: " + Ex.Message);
            }
            finally
            {
            }
            return fechaUltimoTurno;

        }
        public static List<EstadoTurno> obtenerEstadosTurno()
        {
            List<EstadoTurno> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idEstadoTurno, nombre FROM Estado_Turno";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<EstadoTurno>();
                    EstadoTurno estado = null;
                    while (dr.Read())
                    {
                        estado = new EstadoTurno();
                        estado.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        estado.Nombre = dr["nombre"].ToString();

                        list.Add(estado);
                        estado = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public static List<Consultorio> obtenerConsultorios()
        {
            List<Consultorio> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idConsultorio, nombre FROM Consultorio";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<Consultorio>();
                    Consultorio cons = null;
                    while (dr.Read())
                    {
                        cons = new Consultorio();
                        cons.IdConsultorio = int.Parse(dr["idConsultorio"].ToString());
                        cons.Nombre = dr["nombre"].ToString();

                        list.Add(cons);
                        cons = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public static List<Turno> obtenerTurnosPorFechaManiana(DateTime fechaBuscar)
        {
            List<Turno> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idTurno, fechaTurno, horaTurno, horaRealLlegada, nroHCpaciente, idPersonaPaciente, idEstadoTurno, legajoMedico, idEspecialidad "
                               + "FROM Turno WHERE CONVERT(varchar(10), fechaTurno, 103) = CONVERT(varchar(10), @fecha, 103) AND (horaTurno < CONVERT(TIME, '2014-11-12 13:00:00', 102)) "
                               + "ORDER BY horaTurno";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<Turno>();
                    Turno objTurno = null;
                    while (dr.Read())
                    {
                        objTurno = new Turno();
                        objTurno.IdTurno = int.Parse(dr["idTurno"].ToString());
                        objTurno.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        objTurno.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        if (dr["nroHCpaciente"] == DBNull.Value)
                            objTurno.NroHCPaciente = 0;
                        else
                            objTurno.NroHCPaciente = int.Parse(dr["nroHCpaciente"].ToString());
                        if (dr["idPersonaPaciente"] == DBNull.Value)
                            objTurno.IdPersona = null;
                        else
                            objTurno.IdPersona = int.Parse(dr["idPersonaPaciente"].ToString());
                        objTurno.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        objTurno.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        objTurno.LegajoMedico = long.Parse(dr["legajoMedico"].ToString());

                        list.Add(objTurno);
                        objTurno = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }
        public static List<Turno> obtenerTurnosPorFechaTarde(DateTime fechaBuscar)
        {
            List<Turno> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idTurno, fechaTurno, horaTurno, horaRealLlegada, nroHCpaciente, idPersonaPaciente, idEstadoTurno, legajoMedico, idEspecialidad "
                               + "FROM Turno WHERE CONVERT(varchar(10), fechaTurno, 103) = CONVERT(varchar(10), @fecha, 103) AND (horaTurno > CONVERT(TIME, '2014-11-12 13:00:00', 102)) "
                               + "ORDER BY horaTurno";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<Turno>();
                    Turno objTurno = null;
                    while (dr.Read())
                    {
                        objTurno = new Turno();
                        objTurno.IdTurno = int.Parse(dr["idTurno"].ToString());
                        objTurno.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        objTurno.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        if (dr["nroHCpaciente"] == DBNull.Value)
                            objTurno.NroHCPaciente = 0;
                        else
                            objTurno.NroHCPaciente = int.Parse(dr["nroHCpaciente"].ToString());
                        if (dr["idPersonaPaciente"] == DBNull.Value)
                            objTurno.IdPersona = null;
                        else
                            objTurno.IdPersona = int.Parse(dr["idPersonaPaciente"].ToString());
                        objTurno.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        objTurno.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        objTurno.LegajoMedico = long.Parse(dr["legajoMedico"].ToString());

                        list.Add(objTurno);
                        objTurno = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public static List<Turno> obtenerTurnosPorFechaYMedico(DateTime fechaBuscar, long legajo)
        {
            List<Turno> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idTurno, fechaTurno, horaTurno, horaRealLlegada, nroHCpaciente, idPersonaPaciente, idEstadoTurno, legajoMedico, idEspecialidad "
                               + "FROM Turno WHERE CAST(Turno.fechaTurno as DATE)=CAST(@fecha as DATE) and legajoMedico=@legajo ORDER BY horaTurno";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<Turno>();
                    Turno objTurno = null;
                    while (dr.Read())
                    {
                        objTurno = new Turno();
                        objTurno.IdTurno = int.Parse(dr["idTurno"].ToString());
                        objTurno.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        objTurno.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        if (dr["nroHCpaciente"] == DBNull.Value)
                            objTurno.NroHCPaciente = 0;
                        else
                            objTurno.NroHCPaciente = int.Parse(dr["nroHCpaciente"].ToString());
                        if (dr["idPersonaPaciente"] == DBNull.Value)
                            objTurno.IdPersona = null;
                        else
                            objTurno.IdPersona = int.Parse(dr["idPersonaPaciente"].ToString());
                        objTurno.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        objTurno.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        objTurno.LegajoMedico = long.Parse(dr["legajoMedico"].ToString());

                        list.Add(objTurno);
                        objTurno = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }
        public static List<EspecialidadMedico> obtenerEspecialidadMedicoFecha(DateTime fechaBuscar)
        {
            List<EspecialidadMedico> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT MedicoXEspecialidad.legajo, MedicoXEspecialidad.codEspecialidad FROM Turno INNER JOIN "
                                + "MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad "
                                + "WHERE CONVERT(varchar(10), fechaTurno, 103) = CONVERT(varchar(10), @fecha, 103) "
                                + "GROUP BY MedicoXEspecialidad.codEspecialidad, MedicoXEspecialidad.legajo";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<EspecialidadMedico>();
                    EspecialidadMedico espMed = null;
                    while (dr.Read())
                    {
                        espMed = new EspecialidadMedico();
                        espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        espMed.LegajoMedico = int.Parse(dr["legajo"].ToString());
                        list.Add(espMed);
                        espMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        public static List<EspecialidadMedico> obtenerEspecialidadMedicoFecha2Maniana(DateTime fechaBuscar, int idDia)
        {
            List<EspecialidadMedico> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT distinct MedicoXEspecialidad.legajo, MedicoXEspecialidad.codEspecialidad, HorarioAtencionXMedicoXEspecialidad.diaSemana, Consultorio.idConsultorio, Consultorio.nombre, "
                      + "Especialidad.nombre AS nombreEsp, Persona.nombre AS nombreMedico, Persona.apellido AS apellidoMedico, Modalidad_Atencion.duracionAtencion FROM Turno INNER JOIN "
                      + "MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "HorarioAtencionXMedicoXEspecialidad ON MedicoXEspecialidad.legajo = HorarioAtencionXMedicoXEspecialidad.legajo AND "
                      + "MedicoXEspecialidad.codEspecialidad = HorarioAtencionXMedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "Consultorio ON HorarioAtencionXMedicoXEspecialidad.idConsultorio = Consultorio.idConsultorio INNER JOIN "
                      + "Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN "
                      + "Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                      + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN "
                      + "Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad "
                        + "WHERE   (HorarioAtencionXMedicoXEspecialidad.diaSemana = @idDia) AND (Modalidad_Atencion.fechaVigenciaHasta IS NULL OR "
                      + "Modalidad_Atencion.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta IS NULL OR "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.horaDesde < CONVERT(TIME, '2014-11-12 13:00:00', 102))";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                sqlcmd.Parameters.Add(new SqlParameter("@idDia", idDia));

                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<EspecialidadMedico>();
                    EspecialidadMedico espMed = null;
                    while (dr.Read())
                    {
                        espMed = new EspecialidadMedico();
                        espMed.idConsultorioPorDiaBuscado = int.Parse(dr["idConsultorio"].ToString());
                        //ESPECIALIDAD
                        espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        espMed.Especialidad = new Especialidad();
                        espMed.Especialidad.Nombre = dr["nombreEsp"].ToString();
                        //MEDICO
                        espMed.Medico = new Medico();
                        espMed.Medico.ApellidoNombre = dr["apellidoMedico"].ToString() + ", " + dr["nombreMedico"].ToString();
                        espMed.LegajoMedico = int.Parse(dr["legajo"].ToString());
                        //DURACION DE ATENCION
                        espMed.duracionAtencion = int.Parse(dr["duracionAtencion"].ToString());

                        list.Add(espMed);
                        espMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        } //FIN METODO

        public static List<EspecialidadMedico> obtenerEspecialidadMedicoFecha2Tarde(DateTime fechaBuscar, int idDia)
        {
            List<EspecialidadMedico> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT distinct MedicoXEspecialidad.legajo, MedicoXEspecialidad.codEspecialidad, HorarioAtencionXMedicoXEspecialidad.diaSemana, Consultorio.idConsultorio, Consultorio.nombre, "
                      + "Especialidad.nombre AS nombreEsp, Persona.nombre AS nombreMedico, Persona.apellido AS apellidoMedico, Modalidad_Atencion.duracionAtencion FROM Turno INNER JOIN "
                      + "MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "HorarioAtencionXMedicoXEspecialidad ON MedicoXEspecialidad.legajo = HorarioAtencionXMedicoXEspecialidad.legajo AND "
                      + "MedicoXEspecialidad.codEspecialidad = HorarioAtencionXMedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "Consultorio ON HorarioAtencionXMedicoXEspecialidad.idConsultorio = Consultorio.idConsultorio INNER JOIN "
                      + "Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN "
                      + "Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                      + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN "
                      + "Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad "
                        + "WHERE   (HorarioAtencionXMedicoXEspecialidad.diaSemana = @idDia) AND (Modalidad_Atencion.fechaVigenciaHasta IS NULL OR "
                      + "Modalidad_Atencion.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta IS NULL OR "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.horaDesde > CONVERT(TIME, '2014-11-12 13:00:00', 102))";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                sqlcmd.Parameters.Add(new SqlParameter("@idDia", idDia));

                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<EspecialidadMedico>();
                    EspecialidadMedico espMed = null;
                    while (dr.Read())
                    {
                        espMed = new EspecialidadMedico();
                        espMed.idConsultorioPorDiaBuscado = int.Parse(dr["idConsultorio"].ToString());
                        //ESPECIALIDAD
                        espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        espMed.Especialidad = new Especialidad();
                        espMed.Especialidad.Nombre = dr["nombreEsp"].ToString();
                        //MEDICO
                        espMed.Medico = new Medico();
                        espMed.Medico.ApellidoNombre = dr["apellidoMedico"].ToString() + ", " + dr["nombreMedico"].ToString();
                        espMed.LegajoMedico = int.Parse(dr["legajo"].ToString());
                        //DURACION DE ATENCION
                        espMed.duracionAtencion = int.Parse(dr["duracionAtencion"].ToString());

                        list.Add(espMed);
                        espMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        } //FIN METODO


        public static List<EspecialidadMedico> obtenerEspecialidadMedicoFechaXMedico(DateTime fechaBuscar, int idDia, long legajo)
        {
            List<EspecialidadMedico> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT distinct MedicoXEspecialidad.legajo, MedicoXEspecialidad.codEspecialidad, HorarioAtencionXMedicoXEspecialidad.diaSemana, Consultorio.idConsultorio, Consultorio.nombre, "
                      + "Especialidad.nombre AS nombreEsp, Persona.nombre AS nombreMedico, Persona.apellido AS apellidoMedico, Modalidad_Atencion.duracionAtencion FROM Turno INNER JOIN "
                      + "MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "HorarioAtencionXMedicoXEspecialidad ON MedicoXEspecialidad.legajo = HorarioAtencionXMedicoXEspecialidad.legajo AND "
                      + "MedicoXEspecialidad.codEspecialidad = HorarioAtencionXMedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "Consultorio ON HorarioAtencionXMedicoXEspecialidad.idConsultorio = Consultorio.idConsultorio INNER JOIN "
                      + "Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN "
                      + "Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                      + "Persona ON Medico.codPersona = Persona.codPersona INNER JOIN "
                      + "Modalidad_Atencion ON Especialidad.modalidad = Modalidad_Atencion.codModalidad "
                        + "WHERE   MedicoXEspecialidad.legajo=@legajo and (HorarioAtencionXMedicoXEspecialidad.diaSemana = @idDia) AND (Modalidad_Atencion.fechaVigenciaHasta IS NULL OR "
                      + "Modalidad_Atencion.fechaVigenciaHasta > GETDATE()) AND (HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta IS NULL OR "
                      + "HorarioAtencionXMedicoXEspecialidad.fechaVigenciaHasta > GETDATE())";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fechaBuscar));
                sqlcmd.Parameters.Add(new SqlParameter("@idDia", idDia));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<EspecialidadMedico>();
                    EspecialidadMedico espMed = null;
                    while (dr.Read())
                    {
                        espMed = new EspecialidadMedico();
                        espMed.idConsultorioPorDiaBuscado = int.Parse(dr["idConsultorio"].ToString());
                        //ESPECIALIDAD
                        espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                        espMed.Especialidad = new Especialidad();
                        espMed.Especialidad.Nombre = dr["nombreEsp"].ToString();
                        //MEDICO
                        espMed.Medico = new Medico();
                        espMed.Medico.ApellidoNombre = dr["apellidoMedico"].ToString() + ", " + dr["nombreMedico"].ToString();
                        espMed.LegajoMedico = int.Parse(dr["legajo"].ToString());
                        //DURACION DE ATENCION
                        espMed.duracionAtencion = int.Parse(dr["duracionAtencion"].ToString());

                        list.Add(espMed);
                        espMed = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }
        public static Turno obtenerTurnoPorIdTurno(long idTurno)
        {
            Turno oT = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Especialidad.nombre, Persona.nombre AS nombrePersona, Turno.idEstadoTurno, Turno.fechaTurno, Turno.horaTurno, Persona.apellido, "
                              + "Turno.idEspecialidad, Turno.legajoMedico, Turno.idEstadoTurno "
                              + "FROM Turno INNER JOIN MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                      + "Especialidad ON MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad INNER JOIN "
                      + "Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN "
                      + "Persona ON Medico.codPersona = Persona.codPersona "
                      + "WHERE (Turno.idTurno = @idTurno)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idTurno", idTurno));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        oT = new Turno();
                        oT.IdTurno = int.Parse(dr["idTurno"].ToString());
                        oT.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        oT.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        oT.LegajoMedico = long.Parse(dr["legajoMedico"].ToString());
                        oT.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        oT.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        oT.nombreApellidoMedico = dr["nombrePersona"].ToString() + ", " + dr["apellido"].ToString();
                        oT.nombreEspecialidad = dr["nombre"].ToString();
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return oT;
        }//Fin METODO

        //obtiene el nombre y el nroHC del paciente segun el turno
        public static Turno obtenerPacienteTurno(long idTurno)
        {
            Turno t = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.fechaTurno, Turno.horaTurno, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente, Turno.nroHCpaciente, Turno.idPersonaPaciente "
                                + "FROM Turno INNER JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona WHERE (Turno.idTurno = @idTurno)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idTurno", idTurno));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        t = new Turno();
                        t.IdTurno = int.Parse(dr["idTurno"].ToString());
                        t.NroHCPaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        t.NombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return t;
        }

        //obtiene el nombre y el nroHC del paciente segun el turno
        public static Turno obtenerPacienteTurno(Turno t)
        {
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.fechaTurno, Turno.horaTurno, Persona.nombre AS nombrePaciente, Persona.apellido AS apellidoPaciente, Turno.nroHCpaciente, Turno.idPersonaPaciente "
                                + "FROM Turno INNER JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona WHERE (Turno.idTurno = @idTurno)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idTurno", t.IdTurno));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        t.IdTurno = int.Parse(dr["idTurno"].ToString());
                        t.NroHCPaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        t.IdPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        t.NombrePaciente = dr["apellidoPaciente"].ToString() + ", " + dr["nombrePaciente"].ToString();
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return t;
        }
       
        public static bool asignarTurnoPorId(long nrHC, long idPaciente, int estadoTurno, long idTurno)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            try
            {
                tran = con.BeginTransaction();
                string comando = "UPDATE    Turno "
                                + "SET nroHCpaciente=@nroHc, idPersonaPaciente = @idPersona, idEstadoTurno = @idEstadoTurno "
                                + "where Turno.idTurno=@idTurno";
                List<SqlParameter> listp = new List<SqlParameter>();

                listp.Add(new SqlParameter("@nroHc", nrHC));
                listp.Add(new SqlParameter("@idPersona", idPaciente));
                listp.Add(new SqlParameter("@idEstadoTurno", estadoTurno));
                listp.Add(new SqlParameter("@idTurno", idTurno));
                int dr = DB.EjecutarCommand(comando, listp, con, tran);

                if (dr > 0)
                {
                    resultado = true;
                    tran.Commit();
                }
            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }//FIN METODO

        /// <summary>
        /// Registra la llegada a un turno, y revisa su estado, a ver si tambien le tiene que registrar el cobro o no.
        /// </summary>
        /// <param name="idTurno"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        public static bool registrarLlegadaTurno(long idTurno, Turno t)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "UPDATE Turno SET horaRealLlegada = @horaLlegada, idEstadoTurno = @idEstado WHERE (idTurno = @idTurno)";
                SqlCommand sqlcmd = new SqlCommand(comando, con);

                sqlcmd.Parameters.Add(new SqlParameter("@idTurno", t.IdTurno));
                sqlcmd.Parameters.Add(new SqlParameter("@horaLlegada", t.HoraRealLlegada));
                sqlcmd.Parameters.Add(new SqlParameter("@idEstado", t.IdEstadoTurno));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                {
                    resultado = true;
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }

        public static List<Turno> obtenerTurnosSemana(DateTime fechaDesde, int codEsp, long legajo)
        {
            DateTime fechaHasta = fechaDesde.Date.AddDays(7);
            List<Turno> listTurnosSemana = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.fechaTurno, Turno.horaTurno, Turno.nroHCpaciente, Turno.idPersonaPaciente, "
                                + "Turno.idEstadoTurno, Turno.legajoMedico, Turno.idEspecialidad, Persona.nombre, Persona.apellido "
                                + "FROM Turno LEFT JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona LEFT JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona WHERE (Turno.legajoMedico = @legajo) AND (Turno.idEspecialidad = @codEsp) "
                                + "AND (CAST(fechaTurno AS Date) >= CAST(@fechaDesde AS Date)) AND (CAST(fechaTurno AS Date) <= CAST(@fechaHasta AS Date))";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", codEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaDesde", fechaDesde));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaHasta", fechaHasta));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    listTurnosSemana = new List<Turno>();
                    Turno t = null;
                    while (dr.Read())
                    {
                        t = new Turno();
                        t.IdTurno = long.Parse(dr["idTurno"].ToString());
                        t.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        t.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        if (dr["nroHCpaciente"] == DBNull.Value)
                            t.NroHCPaciente = 0;
                        else
                        {
                            t.NroHCPaciente = long.Parse(dr["nroHCpaciente"].ToString());
                            t.NombrePaciente = dr["apellido"].ToString() + " " + dr["nombre"].ToString();
                        }
                        if (dr["idPersonaPaciente"] == DBNull.Value)
                            t.IdPersona = 0;
                        else
                            t.IdPersona = long.Parse(dr["idPersonaPaciente"].ToString());
                        t.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        t.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        t.LegajoMedico = int.Parse(dr["legajoMedico"].ToString());

                        listTurnosSemana.Add(t);
                        t = null;
                    }
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listTurnosSemana;
        }

        public static Turno obtenerDatosRecordatorioTurno(long idTurno)
        {
            Turno t = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, MedicoXEspecialidad.codEspecialidad, MedicoXEspecialidad.legajo, Persona.nombre AS nombreMed, Persona.apellido AS apellidoMed, Especialidad.nombre AS nombreEsp, Turno.fechaTurno, Turno.horaTurno "
                               + "FROM Turno INNER JOIN MedicoXEspecialidad ON Turno.legajoMedico = MedicoXEspecialidad.legajo AND Turno.idEspecialidad = MedicoXEspecialidad.codEspecialidad INNER JOIN "
                               + "Medico ON MedicoXEspecialidad.legajo = Medico.legajo INNER JOIN Persona ON Medico.codPersona = Persona.codPersona INNER JOIN "
                               + "Especialidad ON Turno.idEspecialidad = Especialidad.codEspecialidad AND MedicoXEspecialidad.codEspecialidad = Especialidad.codEspecialidad "
                               + "WHERE (Turno.idTurno = @idTurno)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idTurno", idTurno));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                while (dr.Read())
                {
                    t = new Turno();
                    t.IdTurno = idTurno;
                    t.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                    t.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                    EspecialidadMedico espMed = new EspecialidadMedico();
                    espMed.LegajoMedico = long.Parse(dr["legajo"].ToString());
                    espMed.CodEspecialidad = int.Parse(dr["codEspecialidad"].ToString());
                    espMed.ApellidoNombreMedico = dr["apellidoMed"].ToString() + ", " + dr["nombreMed"].ToString();
                    espMed.NombreEspecialidad = dr["nombreEsp"].ToString();
                    t.EspMedico = espMed;
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return t;
        }

        //OBTENER TURNOS DEL PACIENTE POR NROHC 
        public static List<TurnoWeb> obtenerTurnoPornroHC(long nroHC)
        {
            TurnoWeb oT = null;
            List<TurnoWeb> lt = new List<TurnoWeb>();
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.fechaTurno, Turno.horaTurno, Turno.idEstadoTurno, Turno.legajoMedico, Turno.idEspecialidad, Turno.motivoAnulacion, Persona.nombre AS NombreMed,Persona.apellido, "
                      + "Especialidad.nombre as NombreEsp, Turno.nroHCpaciente "
                      + "FROM Persona INNER JOIN "
                      + "Medico ON Persona.codPersona = Medico.codPersona INNER JOIN "
                      + "Turno INNER JOIN "
                      + "Especialidad ON Turno.idEspecialidad = Especialidad.codEspecialidad AND Turno.idEspecialidad = Especialidad.codEspecialidad ON "
                      + "Medico.legajo = Turno.legajoMedico "
                      + "WHERE     (Turno.nroHCpaciente = @nroHC) and Turno.idEstadoTurno=2 or Turno.idEstadoTurno=7";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        oT = new TurnoWeb();
                        oT.idTurno = long.Parse(dr["idTurno"].ToString());
                        oT.FechaTurno = DateTime.Parse(dr["fechaTurno"].ToString());
                        oT.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        int estado = int.Parse(dr["idEstadoTurno"].ToString());
                        switch (oT.FechaTurno.DayOfWeek)
                        {
                            case DayOfWeek.Friday:
                                oT.dia = "Viernes";
                                break;
                            case DayOfWeek.Monday:
                                oT.dia = "Lunes";
                                break;
                            case DayOfWeek.Saturday:
                                oT.dia = "Sábado";
                                break;
                            case DayOfWeek.Sunday:
                                oT.dia = "Domingo";
                                break;
                            case DayOfWeek.Thursday:
                                oT.dia = "Jueves";
                                break;
                            case DayOfWeek.Tuesday:
                                oT.dia = "Martes";
                                break;
                            case DayOfWeek.Wednesday:
                                oT.dia = "Miércoles";
                                break;
                            default:
                                break;
                        }

                        if (estado == 2)
                        {
                            oT.Estado = "Asignado";
                        }
                        else if (estado == 7)
                        {
                            oT.Estado = "Anulado";
                        }
                        oT.Medico = dr["NombreMed"].ToString() + ", " + dr["apellido"].ToString();
                        oT.Especialidad = dr["NombreEsp"].ToString();
                        lt.Add(oT);
                        oT = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return lt;
        }//Fin METODO

        //turnos Web
        public static List<TurnoWeb> obtenerTurnosSemanaWeb(DateTime fechaDesde, int codEsp, long legajo)
        {
            DateTime fechaHasta = fechaDesde.Date.AddDays(7);
            List<TurnoWeb> listTurnosSemana = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Cast(Turno.fechaTurno as date) as FECHA, Turno.horaTurno AS HORA "
                                + "FROM Turno LEFT JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona LEFT JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona WHERE (Turno.legajoMedico = @legajo) AND (Turno.idEspecialidad = @codEsp) "
                                + "AND CAST(fechaTurno AS Date) = CAST(@fechaDesde AS Date) AND Turno.idEstadoTurno = 1";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@codEsp", codEsp));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaDesde", fechaDesde));
                sqlcmd.Parameters.Add(new SqlParameter("@fechaHasta", fechaHasta));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    listTurnosSemana = new List<TurnoWeb>();
                    TurnoWeb t = null;
                    while (dr.Read())
                    {
                        t = new TurnoWeb();
                        t.idTurno = (long)dr["idTurno"];
                        t.FechaTurno = DateTime.Parse(dr["fecha"].ToString());
                        switch (t.FechaTurno.DayOfWeek)
                        {
                            case DayOfWeek.Friday:
                                t.dia = "Viernes";
                                break;
                            case DayOfWeek.Monday:
                                t.dia = "Lunes";
                                break;
                            case DayOfWeek.Saturday:
                                t.dia = "Sabado";
                                break;
                            case DayOfWeek.Sunday:
                                t.dia = "Domingo";
                                break;
                            case DayOfWeek.Thursday:
                                t.dia = "Jueves";
                                break;
                            case DayOfWeek.Tuesday:
                                t.dia = "Martes";
                                break;
                            case DayOfWeek.Wednesday:
                                t.dia = "Miercoles";
                                break;
                            default:
                                break;
                        }
                        t.HoraTurno = TimeSpan.Parse(dr["hora"].ToString());


                        listTurnosSemana.Add(t);
                        t = null;
                    }
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return listTurnosSemana;
        }

        public static List<MedicoTurnoWeb> obtenerTurnosWebMedico(int dia, long legajo, DateTime fecha)
        {
            List<MedicoTurnoWeb> lst = new List<MedicoTurnoWeb>();
            MedicoTurnoWeb t = null;
            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "select T.fechaTurno,T.legajoMedico, DATEPART(WEEKDAY,T.fechaTurno) as dia,T.idEstadoTurno,T.nroHCpaciente,T.idEspecialidad,T.horaTurno "
                                    + "from Turno  T "
                                    + "where T.legajoMedico=@lega and DATEPART(WEEKDAY,T.fechaTurno)=@Dia and idEstadoTurno=2 and T.fechaTurno>=@fecha";
                List<SqlParameter> lsp = new List<SqlParameter>();
                lsp.Add(new SqlParameter("@lega", legajo));
                lsp.Add(new SqlParameter("@fecha", fecha));
                lsp.Add(new SqlParameter("@Dia", dia));
                SqlDataReader dr = DB.GenerarReader(comando, lsp, con);
                while (dr.Read())
                {
                    t = new MedicoTurnoWeb();
                    t.fechaTurno = (DateTime.Parse(dr["fechaTurno"].ToString()));
                    t.idDia = (int)dr["dia"];
                    switch (t.idDia)
                    {
                        case 1:
                            t.dia = "Domingo";
                            break;
                        case 2:
                            t.dia = "Lunes";
                            break;
                        case 3:
                            t.dia = "Martes";
                            break;
                        case 4:
                            t.dia = "Miercoles";
                            break;
                        case 5:
                            t.dia = "Jueves";
                            break;
                        case 6:
                            t.dia = "Viernes";
                            break;
                        case 7:
                            t.dia = "Sabado";
                            break;
                    }
                    t.idEstado = (int)dr["idEstadoTurno"];
                    t.nroHC = (long)dr["nroHCpaciente"];
                    t.idEspec = (int)dr["idEspecialidad"];
                    t.hora = (TimeSpan)dr["horaTurno"];
                    lst.Add(t);
                    t = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            { con.Close(); }
            return lst;
        }

        public static bool cancelarTurnoWeb(long idTurno)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "update Turno set nroHCpaciente = NULL, idPersonaPaciente=NULL, idEstadoTurno = 1 WHERE (idTurno = @idTurno) ";
                List<SqlParameter> lstp = new List<SqlParameter>();
                lstp.Add(new SqlParameter("@idTurno", idTurno));
                int resultado = DB.EjecutarCommand(comando, lstp, con, tran);
                if (resultado > 0)
                {
                    res = true;

                    tran.Commit();
                }
            }
            catch (Exception)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw;
            }
            finally { con.Close(); }

            return res;


        }

        //obtiene los turnos atendidos por el medico en el dia de hoy, siempre y cuando no hayan sido pagados a este.
        public static List<Turno> obtenerTurnosAtendidosPorMedicoEnElDia(int codEsp, long legajo)
        {
            List<Turno> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Turno.idTurno, Turno.fechaTurno, Turno.horaTurno, Turno.idEstadoTurno, Turno.legajoMedico, Turno.idEspecialidad, Turno.idPagoMedico, Turno.montoMedico, Turno.nroHCpaciente, "
                                + "Persona.nombre, Persona.apellido FROM Turno INNER JOIN Paciente ON Turno.nroHCpaciente = Paciente.nroHC AND Turno.idPersonaPaciente = Paciente.idPersona INNER JOIN "
                                + "Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE (CAST(fechaTurno as DATE) = CAST(@fecha as DATE)) AND (idEstadoTurno = 4 OR idEstadoTurno = 6) "
                                + "AND (legajoMedico = @legajo) AND (idEspecialidad = @idEsp) AND (idPagoMedico IS NULL)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", DateTime.Now));
                sqlcmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                sqlcmd.Parameters.Add(new SqlParameter("@idEsp", codEsp));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    list = new List<Turno>();
                    Turno t = null;
                    while (dr.Read())
                    {
                        t = new Turno();
                        t.IdTurno = long.Parse(dr["idTurno"].ToString());
                        t.FechaTurno = Convert.ToDateTime(dr["fechaTurno"].ToString());
                        t.HoraTurno = TimeSpan.Parse(dr["horaTurno"].ToString());
                        t.NroHCPaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        t.NombreCompletoPaciente = dr["nombre"].ToString() + dr["apellido"].ToString();
                        t.IdEstadoTurno = int.Parse(dr["idEstadoTurno"].ToString());
                        t.LegajoMedico = long.Parse(dr["legajoMedico"].ToString());
                        t.IdEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                        if (dr["idPagoMedico"] == DBNull.Value)
                            t.IdPagoMedico = 0;
                        else
                            t.IdPagoMedico = long.Parse(dr["idPagoMedico"].ToString());
                        if (dr["montoMedico"] == DBNull.Value)
                            t.TotalMedico = 0;
                        else
                            t.TotalMedico = float.Parse(dr["montoMedico"].ToString());

                        list.Add(t);
                        t = null;
                    }
                }
            }
            catch (Exception ex)
            {
                
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

    }
}
